2
תגובות

Fluent Interface

פתח alexs3 ,
היי חברה אשמח להסבר קצר על Fluent Interface איך מישמים את זה
תודה מראש

2 תשובות

avatar ענה intval ב 03 ליולי 2015 #

fluent interface איננו איזה רעיון גדול בתכנות. זהו שם למצב שבו מתודה מחזירה מופע של המחלקה אליה היא שייכת, ככה שעל התוצאה שהוחזרה (על האובייקט שהוחזר) ניתן להמשיך ולהפעיל אותה המתודה.

בדרך כלל מתודות בקוד שלך מחזירות ערך כלשהו. למשל מספר, או מערך, או מופע של מחלקה כלשהי. ניקח מחלקה פשוטה עם שני מתודות:

class Calculator
{

  private $sum = 0;
 
  public function add($int)
  {
    $this->sum += $int;
  }

  public function getResult()
  {
    return $this->sum;
  }
}

$calculator = new Calculator();
$calculator->add(5);
$caluclator->add(5);
$caluclator->add(5);
echo $calculator->getResult(); // 15


במקרה של המחלקה הזו, המתודה getResult מחזירה מספר
ואילו המתודה add לא מחזירה שום דבר.
אם ננסה להציב את התוצאה של הפעולה add לתוך משתנה, המשתנה ישאר ריק:

$void = (  $calculator->add(5)  );
echo $void; // nothing


עכשיו נשנה את המתודה `add` כך, שתחזיר את המופע של המחלקה עצמה:

public function add($int)
{
  $this->sum += $int;
  return $this;
}


מה מחזירה הפעולה add עכשיו ? היא מחזירה את אותו המופע ששמור במשתנה calculator

$calc2 = (  $calculator->add(5)  );
echo $calc2 === $calculator; // true


היות שהמופע תחת calc2 הוא אותו מופע, גם לו יש מתודה בשם add שממשיכה את הרצף.
אפשר לקצר את הכתיבה וליצור שרשרת כזו:

$calculator->add(1)->add(2)->add(3)->getResult(); // 6



אז מה זה נותן?
שום דבר מלבד טיפה קיצור בקוד. אין לזה שום יתרונות מיוחדים, שמאפשרים לך לעשות משהו מיוחד שלא יכולת לפני. משתמשים בזה לצורך נוחות בלבד, למשל ב jquery

$("#p1").css("color", "red").slideUp(2000).slideDown(2000);


או בספריות מסד נתונים:

$db->select('field1')->from('table2')->where('x = 3')->getResults();

avatar ענה alexs3 ב 04 ליולי 2015 #

תודה רבה על אלכס פשוט הסבר מעולה